package com.chisheng.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    /* 常见主键生成策略算法
     * 1) auto increment
     * 2) UUID
     * 3) redis
     * 4) Snowflake */

    /* ID 生成策略
     * AUTO: 数据库ID自增，该类型请确保数据库设置了 ID自增 否则无效
     * NONE: 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
     * INPUT: 用户输入ID
     * ASSIGN_ID: 雪花算法生成（只有当插入对象ID 为空，才自动填充）
     * ASSIGN_UUID: UUID.replace("-","")（只有当插入对象ID 为空，才自动填充） */
    @TableId(type = IdType.ASSIGN_ID)

    private Long id;
    private String name;
    private Integer age;
    private String email;

    /* 用于兼容 testInsert，testUpdate 测试方法 */
    public User(Long id, String name, Integer age, String email) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
    }

    /* 自动填充
     * 1) 在需要自动填充的属性上添加 @TableField(fill = FieldFill.xxx) 注解
     * 2) 实现 MetaObjectHandler 接口 */

    @TableField(fill = FieldFill.INSERT /* 插入自动填充字段 */)
    private Date createTime;  /* 自动开启驼峰命名转换为下划线 */

    @TableField(fill = FieldFill.UPDATE /* 修改自动填充字段 */)
    private Date updateTime;

    /* 乐观锁：通过字段 'version' 控制修改版本
     * 悲观锁：串行实现 */

    /* 乐观锁的使用
     * 1) 添加 version 字段和属性
     * 2) 在控制版本的字段上添加 @Version 注解
     * 3) 配置乐观锁插件 OptimisticLockerInnerInterceptor */

    @Version
    @TableField(fill = FieldFill.INSERT)  /* 插入设定初始值 */
    private Integer version;

    /* '逻辑'删除
     * 1) 添加逻辑删除字段和属性
     * 2) 在逻辑删除属性上标注 @TableLogic 注解
     * 3) 配置 DefaultSqlInjector 默认逻辑删除注入器
     *
     * // 自定义配置默认逻辑删除标识
     * mybatis-plus.global-config.db-config.logic-delete-value=1
     * mybatis-plus.global-config.db-config.logic-not-delete-value=0 */

    @TableLogic
    private Integer deleted;  /* 逻辑删除属性 */

}